home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / FixedStorage.C < prev    next >
C/C++ Source or Header  |  1990-12-06  |  3KB  |  138 lines

  1. #include "FixedStorage.h"
  2. #include "Storage.h"
  3. #include "String.h"
  4. #include "Error.h"
  5.  
  6. extern FreeHookFun storageFreeHook;
  7. extern void *storageFreeHookData;
  8.  
  9. struct FreeNode {
  10.     class FreeNode *next;
  11. };
  12.  
  13. struct Chunk {
  14.     struct Chunk *next;
  15.     char *storage;    
  16. };
  17.  
  18. static MemPool *pools[cObjMaxSize];
  19.  
  20. void *MemPools::Alloc(size_t sz)
  21. {
  22.     if (sz >= cObjMaxSize) {
  23.     Warning("MemPools::Alloc", "supports only objects with a size upto %d\n", cObjMaxSize);
  24. #       ifdef __GNUG__
  25.         return (void*) new char[sz];
  26. #       else
  27.     return ::operator new(sz);
  28. #           endif __GNUG__
  29.     }
  30.     MemPool *mp= pools[sz];
  31.     if (mp == 0) 
  32.     mp= pools[sz]= new MemPool(sz);
  33.     return mp->Alloc();
  34. }
  35.  
  36. void MemPools::Free(void *vp, size_t sz)
  37. {
  38.     MemPool *mp;
  39.     if (sz >= cObjMaxSize) {
  40. #       ifdef __GNUG__
  41.         delete vp;
  42. #       else
  43.         ::operator delete(vp);
  44. #       endif __GNUG__
  45.     return;
  46.     }
  47.     else
  48.     mp= pools[sz];
  49.     
  50.     if (mp)
  51.     mp->Free(vp);
  52.     else
  53.     Fatal("MemPools::Dealloc", "No pool of size %d\n", sz);
  54. }
  55.     
  56. void MemPools::FreePools()
  57. {
  58.     for (int i= 0; i < cObjMaxSize; i++) {
  59.     MemPool **fs= &pools[i];
  60.     SafeDelete(fs);
  61.     }
  62. }
  63. void MemPools::PrintStatistics()
  64. {
  65.     cerr << "Pools statistics\n----------------\n" <<
  66.         form("%-10s%8s%8s%8s%8s\n", "size", "alloc", "recycl", "freed", "chunks");
  67.  
  68.     MemPool *fsp;
  69.     for (int i= 0; i < cObjMaxSize; i++) 
  70.     if (fsp= pools[i]) 
  71.         cerr << form("%10d%8d%8d%8d%8d\n", 
  72.                 fsp->objSize, fsp->allocated, 
  73.                 fsp->recycled, fsp->freed, fsp->nchunks);
  74. }
  75.  
  76. //---- class MemPool ---------------------------------------------------------
  77.  
  78. MemPool::MemPool(size_t osize)
  79. {
  80.     objSize= osize;
  81.     chunkSize= cMemPoolSize * objSize;
  82.     chunks= 0;
  83.     lastIndex= cMemPoolSize; // force allocation of a new chunk
  84.     freeList= 0;
  85.     nchunks= allocated= recycled= freed= 0;
  86. }
  87.  
  88. MemPool::~MemPool()
  89. {
  90.     Chunk *p, *lp;
  91.  
  92.     for (p= chunks; p; p= lp) {
  93.     delete p->storage;
  94.     lp= p->next;
  95.     delete p;
  96.     }
  97. }
  98.  
  99. void *MemPool::Alloc()
  100. {
  101.     allocated++;
  102.     if (freeList) {
  103.     recycled++;
  104.     FreeNode *tmp= freeList;
  105.     freeList= freeList->next;
  106.     return (void*)tmp;
  107.     }
  108.     if (lastIndex >= cMemPoolSize) { // need new chunk
  109.     nchunks++;
  110.     Chunk *cp;
  111.     cp= new Chunk;
  112.     cp->next= chunks;
  113.     chunks= cp;
  114.     chunks->storage= new char[chunkSize];
  115.     lastIndex= 0;
  116.     }
  117.     return (void*)&chunks->storage[lastIndex++*objSize];
  118. }
  119.  
  120. void MemPool::Free(void *op)
  121. {
  122.     if (storageFreeHook)
  123.     storageFreeHook(storageFreeHookData, op, objSize);
  124.  
  125.     for (Chunk *p= chunks; p; p= p->next) {
  126.     if (op >= (void*)p->storage && op <  (void*)(p->storage + chunkSize)) {
  127.         bzero((char*) op, objSize);
  128.         FreeNode *fn= (FreeNode*)op;
  129.         fn->next= freeList;
  130.         freeList= fn;
  131.         freed++;
  132.         return;
  133.     }
  134.     }
  135.     Fatal("MemPool::Free", "object to delete not found in pool %d", objSize);
  136. }
  137.  
  138.